Distributed systems allow multiple clients in a network to access a pool of shared resources. For example, a distributed storage system allows a cluster of host computers to aggregate local disks (e.g., SSD, PCI-based flash storage, SATA, or SAS magnetic disks) located in or attached to each host computer to create a single and shared pool of storage. This pool of storage (sometimes referred to herein as a “datastore” or “store”) is accessible by all host computers in the cluster and may be presented as a single namespace of storage entities (such as a hierarchical file system namespace in the case of files, a flat namespace of unique identifiers in the case of objects, etc.). Storage clients in turn, such as virtual machines spawned on the host computers may use the datastore, for example, to store virtual disks that are accessed by the virtual machines during their operation. Because the shared local disks that make up the datastore may have different performance characteristics (e.g., capacity, input/output per second (IOPS) capabilities, etc.), usage of such shared local disks to store virtual disks or portions thereof may be distributed among the virtual machines based on the needs of each given virtual machine. Accordingly, in some cases, a virtual disk may be partitioned into different chunks or stripes that are distributed among and stored by local disks of hosts in the datastore.
In addition, as a way to provide fault-tolerance in a distributed storage system, erasure coding technologies are employed to implement redundancies in data storage. In such a system, if one or more of the host computers of the distributed storage system fails or goes offline, the data stored by those host computers can be resynced or reconstructed after they come back online, using the data stored in the other host computers. However, resyncing or reconstructing of the data is sometimes not performance efficient.